package com.chub;

import cn.hutool.core.util.StrUtil;
import lombok.Data;

/**
 * @author : chub
 * @version : V1.0.0
 * @fileName : RespResult.java
 * @description : TODO
 * @createTime : 2023-10-17 17:26
 */
@Data
public class RespResult<T> {
    /**
     * 响应状态, 是否成功
     */
    private boolean success;

    /**
     * 状态码
     */
    private Integer code;

    /**
     * 状态信息
     */
    private String message;

    /**
     * 数据信息
     */
    private T data;

    /**
     * 私有构造，全参数
     *
     * @param success 响应状态
     * @param code    状态码
     * @param message 状态信息
     * @param data    数据
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    private static <T> RespResult<T> response(Boolean success, Integer code, String message, T data) {
        RespResult<T> result = new RespResult<>();
        result.setSuccess(success);
        result.setCode(code);
        result.setMessage(message);
        result.setData(data);
        return result;
    }

    /**
     * 请求成功返回（一）
     *
     * @param code    状态码
     * @param message 状态信息
     * @param data    数据
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> success(Integer code, String message, T data) {
        return response(true, code, message, data);
    }

    /**
     * 请求成功返回（二）
     *
     * @param message 状态信息
     * @param data    数据
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> success(String message, T data) {
        return response(true, RespEnum.OPERATOR_IS_SUCCESS.getCode(), message, data);
    }

    /**
     * 请求成功返回（三）
     *
     * @param message 状态信息
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> success(String message) {
        return response(true, RespEnum.OPERATOR_IS_SUCCESS.getCode(), message, null);
    }

    /**
     * 请求成功返回（四）
     *
     * @param respEnum     状态枚举
     * @param <T>          泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> success(RespEnum respEnum) {
        return response(true, respEnum.getCode(), respEnum.getMessage(), null);
    }

    /**
     * 请求成功返回（五）
     *
     * @param respEnum     状态枚举
     * @param data         数据
     * @param <T>          泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> success(RespEnum respEnum, T data) {
        return response(true, respEnum.getCode(), respEnum.getMessage(), data);
    }

    /**
     * 请求成功返回（六）
     * @param data 数据
     * @return 结果集处理器
     * @param <T> 泛型数据
     */
    public static <T> RespResult<T> success( T data) {
        return response(true, RespEnum.OPERATOR_IS_SUCCESS.getCode(), RespEnum.OPERATOR_IS_SUCCESS.getMessage(), data);
    }

    /**
     * 请求成功返回（七）
     *
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> success() {
        return response(true, RespEnum.OPERATOR_IS_SUCCESS.getCode(), RespEnum.OPERATOR_IS_SUCCESS.getMessage(), null);
    }

    /**
     * 请求成功返回（八）  格式化返回参数
     * example：ResponseResult.success("first param-->{}, 2nd param-->{}, 3th param-->{}", id, oldName, newName)
     * @param msg
     * @param args
     * @param <T>
     * @return
     */
    public static <T> RespResult<T> success(String msg, Object... args) {
//        msg = String.format(msg, args);
//        msg = MessageFormat.format(msg, args);
        msg = StrUtil.format(msg, args);
        return response(true, RespEnum.OPERATOR_IS_SUCCESS.getCode(), msg, null);
    }


    /**
     * 请求失败返回（一）
     *
     * @param code    状态码
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> error(Integer code) {
        return response(false, code, null, null);
    }

    /**
     * 请求失败返回（二）
     *
     * @param message 状态信息
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> error(String message) {
        return response(false, RespEnum.OPERATOR_IS_FAILED.getCode(), message, null);
    }

    /**
     * 请求失败返回（三）
     *
     * @param code    状态码
     * @param message 状态信息
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> error(Integer code, String message) {
        return response(false, code, message, null);
    }

    /**
     * 请求失败返回（四）
     *
     * @param code    状态码
     * @param message 状态信息
     * @param data    数据
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> error(Integer code, String message, T data) {
        return response(false, code, message, data);
    }

    /**
     * 请求失败返回（无）
     *
     * @param message 状态信息
     * @param data    数据
     * @param <T>     泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> error(String message, T data) {
        return response(false, RespEnum.OPERATOR_IS_FAILED.getCode(), message, data);
    }



    /**
     * 请求失败返回（六）
     *
     * @param respEnum     状态枚举
     * @param <T>          泛型数据
     * @return 结果集处理器
     */
    public static <T> RespResult<T> error(RespEnum respEnum) {
        return response(false, respEnum.getCode(), respEnum.getMessage(), null);
    }
    
}
